package org.ttitfly.workflow.engine;

import org.ttitfly.workflow.exception.ProcessRunException;

/**
 * 活动
 * 
 * <p>
 * 活动是流程执行任务的最小单位，活动必须属于且仅属于一个流程，由流程负责初始化和调度运行。活动属于人工运行单元，即运行后需要等待进行人工处理才能进入关闭(
 * <code>CLOSED</code>)状态。
 * </p>
 * <p>
 * 活动至少拥有一个可执行的<code>Action</code>，<code>Action</code>指向后续运行单元的名称，如此串接成一个完整的流程链。
 * <code>Action</code>执行后将返回后续运行单元的名称，返回<code>null</code>则说明一个流程分支完成，或者整个流程完成。
 * </p>
 * 
 * @author 潘海春
 * @version 2009-8-31
 * @see RunUnit
 */
public interface Activity extends RunUnit {

	/**
	 * 首先将检查活动状态，必须处于运行(<code>RUNNING</code>)状态才允许执行，否则将抛出
	 * <code>ProcessRunException</code>。
	 * 执行默认动作，默认动作由特殊的名称或者空名称标识，一个活动至多拥有一个默认动作，若没有找到默认动作，将抛出
	 * <code>ProcessRunException</code>。 若找到，将调用其{@link Action#execute()}
	 * 方法，并得到返回的后续单元名称。通常情况会将当前活动的状态置为关闭(<code>CLOSED</code>)
	 * 以示结束本次活动运行，若有相关退出处理程序
	 * ，将执行之。同时应该触发流程调度后续单元，如此才得以流程继续运行。若动作返回了null，则会触发流程检查是否已经完成，
	 * 否则可能导致活动全部完成而流程状态还在运行的情况。
	 * <p>
	 * 若决定不结束本次活动，则通常情况下立即返回而不触发流程调度后续运行单元，除非允许后续单元被再次运行。
	 * </p>
	 * 
	 * @throws ProcessRunException
	 *             1.状态不正确 2.找不到默认动作时 3.<code>Action</code>执行过程抛出的异常将被包装成本异常抛出。
	 * @see Action#execute()
	 */
	void execute() throws ProcessRunException;

	/**
	 * 首先将检查活动状态，必须处于运行(<code>RUNNING</code>)状态才允许执行，否则将抛出
	 * <code>ProcessRunException</code>。
	 * 执行指定名字动作，同一个活动不存在多个动作同名，若没有找到符合名称的动作，将抛出<code>ProcessRunException</code>。
	 * 
	 * @param actionName
	 *            将要执行动作的名称。
	 * @throws ProcessRunException
	 *             1.状态不正确 2.找不到指名的动作时 3.<code>Action</code>执行过程抛出的异常将被包装成本异常抛出。
	 * @see #execute()
	 * @see Action#execute()
	 */
	void execute(String actionName) throws ProcessRunException;

}
